import { get, post, put, del, upload } from './http'

/**
 * 请求方法封装
 * 提供模拟数据功能，方便开发和测试
 */

// 是否使用模拟数据
const useMock = true

/**
 * 模拟请求成功响应
 * @param {any} data - 响应数据
 * @param {string} message - 响应消息
 * @returns {Promise} 成功的Promise
 */
const mockSuccess = (data, message = '操作成功') => {
  return Promise.resolve({
    code: 200,
    success: true,
    data,
    message
  })
}

/**
 * 模拟请求失败响应
 * @param {string} message - 错误消息
 * @param {number} code - 错误码
 * @returns {Promise} 失败的Promise
 */
const mockError = (message = '操作失败', code = 500) => {
  return Promise.reject({
    code,
    success: false,
    message
  })
}

/**
 * 延迟执行
 * @param {Function} callback - 回调函数
 * @param {number} delay - 延迟时间（毫秒）
 * @returns {Promise} Promise对象
 */
const delay = (callback, delay = 500) => {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(callback())
    }, delay)
  })
}

/**
 * GET请求
 * @param {string} url - 请求地址
 * @param {object} params - 请求参数
 * @param {object} config - 请求配置
 * @param {Function} mockFn - 模拟数据函数
 * @returns {Promise} 请求Promise
 */
export const request = {
  get: (url, params = {}, config = {}, mockFn) => {
    if (useMock && mockFn) {
      return delay(() => mockFn(params))
    }
    return get(url, params, config)
  },

  /**
   * POST请求
   * @param {string} url - 请求地址
   * @param {object} data - 请求数据
   * @param {object} config - 请求配置
   * @param {Function} mockFn - 模拟数据函数
   * @returns {Promise} 请求Promise
   */
  post: (url, data = {}, config = {}, mockFn) => {
    if (useMock && mockFn) {
      return delay(() => mockFn(data))
    }
    return post(url, data, config)
  },

  /**
   * PUT请求
   * @param {string} url - 请求地址
   * @param {object} data - 请求数据
   * @param {object} config - 请求配置
   * @param {Function} mockFn - 模拟数据函数
   * @returns {Promise} 请求Promise
   */
  put: (url, data = {}, config = {}, mockFn) => {
    if (useMock && mockFn) {
      return delay(() => mockFn(data))
    }
    return put(url, data, config)
  },

  /**
   * DELETE请求
   * @param {string} url - 请求地址
   * @param {object} config - 请求配置
   * @param {Function} mockFn - 模拟数据函数
   * @returns {Promise} 请求Promise
   */
  delete: (url, config = {}, mockFn) => {
    if (useMock && mockFn) {
      return delay(() => mockFn())
    }
    return del(url, config)
  },

  /**
   * 文件上传
   * @param {string} url - 上传地址
   * @param {FormData} formData - 文件数据
   * @param {object} config - 请求配置
   * @param {Function} mockFn - 模拟数据函数
   * @returns {Promise} 请求Promise
   */
  upload: (url, formData, config = {}, mockFn) => {
    if (useMock && mockFn) {
      return delay(() => mockFn(formData))
    }
    return upload(url, formData, config)
  }
}

export { mockSuccess, mockError }
export default request